package com.heihei.serviceimpl.son;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.heihei.common.page.Condition;
import com.heihei.common.page.Query;
import com.heihei.common.response.ResponseVO;
import com.heihei.entity.son.SonSongEntity;
import com.heihei.enums.DeleteFlagEnum;
import com.heihei.mapper.son.SonSongMapper;
import com.heihei.service.son.SonSongService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heihei.vo.son.SongWithSingerNameVO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 歌曲表 服务实现类
 * </p>
 *
 * @author duanhengfei
 * @since 2021-11-29
 */
@Service
public class SonSongServiceImpl extends ServiceImpl<SonSongMapper, SonSongEntity> implements SonSongService {

    /**
     * 添加
     *
     * @author duanhengfei
     * 2021年12月18日 23:36:47
     */
    @Override
    public ResponseVO<String> myAdd(SonSongEntity paramEntity) {
        paramEntity.setId(null);
        //歌曲名称不能为空
        if(StringUtils.isEmpty(paramEntity.getSongName())) {
            return ResponseVO.paramLess("歌曲名称不能为空");
        }
        boolean flag = this.save(paramEntity);
        if(!flag) {
            return ResponseVO.dealException("添加可能未成功");
        }
        return ResponseVO.dealSuccess(paramEntity.getId());
    }

    /**
     * 修改
     *
     * @author duanhengfei
     * 2021年12月18日 23:40:16
     */
    @Override
    public ResponseVO<Boolean> myUpdateById(SonSongEntity paramEntity) {
        if(StringUtils.isEmpty(paramEntity.getId())) {
            return ResponseVO.paramLess("主键ID不能为空");
        }
        //修改时，不允许删除
        paramEntity.setDelFlag(null);
        //只能修改未删除的数据
        SonSongEntity currDbEntity = this.getById(paramEntity.getId());
        if(Objects.isNull(currDbEntity)) {
            return ResponseVO.paramIllegal("该记录不存在");
        }
        if(DeleteFlagEnum.DELETED.getKey().equals(currDbEntity.getDelFlag())) {
            return ResponseVO.paramIllegal("该记录可能已删除");
        }
        //执行修改操作
        boolean flag = this.updateById(paramEntity);
        if(!flag) {
            return ResponseVO.paramIllegal("修改可能失败");
        }
        return ResponseVO.dealSuccess(true);
    }

    /**
     * 逻辑删除
     *
     * @author duanhengfei
     * 2021年12月18日 23:45:33
     */
    @Override
    public ResponseVO<Boolean> deleteByIdLogic(String id) {
        if(StringUtils.isEmpty(id)) {
            return ResponseVO.paramLess("主键ID不能为空");
        }
        SonSongEntity entity = new SonSongEntity();
        entity.setId(id);
        entity.setDelFlag(DeleteFlagEnum.DELETED.getKey());
        boolean flag = this.updateById(entity);
        if(!flag) {
            return ResponseVO.paramIllegal("该记录可能不存在");
        }
        return ResponseVO.dealSuccess(true);
    }

    /**
     * 批量删除
     *
     * @author duanhengfei
     * 2021年12月18日 23:47:44
     */
    @Override
    public ResponseVO<Boolean> deleteBatch(List<String> idList) {
        if(CollectionUtils.isEmpty(idList)) {
            return ResponseVO.paramLess("请传入要删除的ID");
        }
        List<SonSongEntity> entityList = idList.stream().map(id -> {
            SonSongEntity ent = new SonSongEntity();
            ent.setId(id);
            ent.setDelFlag(DeleteFlagEnum.DELETED.getKey());
            return ent;
        }).collect(Collectors.toList());
        boolean flag = this.updateBatchById(entityList);
        if(!flag) {
            return ResponseVO.paramIllegal("该记录可能不存在");
        }
        return ResponseVO.dealSuccess();
    }

    /**
     * 列表查询
     *
     * @author duanhengfei
     * 2021年12月18日 23:53:21
     */
    @Override
    public ResponseVO<IPage<SongWithSingerNameVO>> myPageList(SongWithSingerNameVO entityParam, Query query) {
        IPage<SongWithSingerNameVO> pageList = this.baseMapper.myPageList(Condition.getPage(query), entityParam, DeleteFlagEnum.NOT_DELETED.getKey());
        //pageList做一层筛选，将singerDelFlag已删除的，置空
        pageList.getRecords().forEach(vo -> {
            if(DeleteFlagEnum.DELETED.getKey().equals(vo.getSingerDelFlag())) {
                vo.removeSingerInfo();
            }
        });
        return ResponseVO.dealSuccess(pageList);
    }

    /**
     * 详情
     *
     * @author duanhengfei
     * 2021年12月19日 00:16:11
     */
    @Override
    public ResponseVO<SongWithSingerNameVO> myGetById(String id) {
        SongWithSingerNameVO vo = this.baseMapper.getByIdWithSingerName(id, DeleteFlagEnum.NOT_DELETED.getKey());
        if(Objects.isNull(vo)) {
            return ResponseVO.paramIllegal("该记录可能不存在或者已被删除");
        }
        //做筛选，歌手已被删除的话，不做显示歌手
        if(DeleteFlagEnum.DELETED.getKey().equals(vo.getSingerDelFlag())) {
            vo.removeSingerInfo();
        }
        return ResponseVO.dealSuccess(vo);
    }


}
